618技术大揭秘:Switchquery秒级配置触达平台的设计与实现
Tech导读
Switchquery是一个秒级触达的高性能移动配置下发平台,特别适用于对实时性要求较高的配置下发场景。本文介绍秒级触达能力的实现原理以及在大促场景下的实践,欢迎大家交流探讨。
导读
Switchquery是一个秒级触达的高性能移动配置下发平台,特别适用于对实时性要求较高的配置下发场景。本文介绍秒级触达能力的实现原理以及在大促场景下的实践,欢迎大家交流探讨。01 背景
在今年的敏捷团队建设中,我通过Suite执行器实现了一键自动化单元测试。Juint除了Suite执行器还有哪些执行器呢?由此我的Runner探索之旅开始了!
02
技术原理
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。
2.1 触达技术选型
2.2 实现原理
2.2.1 实时触达方案
由于推送push消息方案存在触达比例低的问题,长链接存在耗费服务器资源的缺点,同时轮询的方案也存在很多无效的网络传输等弊端,因此以上三种方案都不是Switchquery 配置平台的触达方案的最佳技术选型。通过调研,采取了一种配置信息从服务端实时触达到客户端的新方案,方案的具体描述为: 先搭建一个信息配置管理CMS平台,同时构建一个客户端获取配置信息的客户端组件,由用户在CMS配置信息,然后由CMS后台将配置信息的版本号信息同步至统一网关,所有客户端请求到达统一网关,并在返回的接口数据的header内都会携带最新的版本号至客户端,客户端对比发现新的版本号比缓存的版本大则请求配置信息拉取Switchquery配置接口,这样只要App打开就会存在接口携带变化标志返回,这样就会触发客户端主动发起请求更新配置信息,提高了实时性,不受push开关权限控制和影响,不需要额外打造长连接通道,具有低成本,实时性高等优点。以下是Switchquery配置平台的时序图:
2.2.2 流程架构设计
2.3 技术优化
4)实时触达方案在App原生端来实现此功能,同时对于App内嵌的小程序、H5、RN都提供了桥接组件,尤其webview也可以读取此配置信息来实现配置信息的实时获取。
03
支持多APP
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。
Switchquery 作为基础的信息配置平台,更多的App会需要基础配置信息能力,因此支持一整套从配置客户端组件控制到后台CMS支持多App切换以及网关实时秒级触达的一整套秒级触达的高性能移动配置配置平台也是Switchquery的未来发展方向,下面介绍支持多App的客户端和CMS的设计与实现。
3.1 客户端
Switchquery 在主站中的秒级变更能力是基于主站客户端的网络框架在不间断随机广播全局通知触发,但是在 Switchquery SDK化的过程中,不能将主站的网络框架一起集成,因为网络框架依赖项比较多,如果集成网络框架这样独立出来的SDK会导致依赖项会更多,给App赋能的能力就会受到限制,不够轻量。因此Switchquery支持多App需要适配京东集团内的App目前的所使用的网络框架,同样Switchquery 中也会涉及到异常埋点等埋点相关信息,因此对于支持需要接入的App也需要适配埋点等相关接口等。因此最终客户端的类图如下:
3.2 CMS
通过下拉菜单的方式,选择需要配置的App空间,默认为主站,每个应用空间会分配不同的AppId,每个应用空间的CMS和后台在接口请求时,会携带当前应用空间所分配的AppId,这样可以实现了不同App应用空间的数据隔离。
04 接入流程
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目
4.1 客户端
4.1.1 Android 平台接入
//chName:开关名称,拉取失败或未取到配置返回defValue默认值
SwitchQueryFetcher.getSwitchBooleanValue(String switchName, boolean defValue)
//获取int开关值,拉取失败或未拉取到配置返回defValue默认值
SwitchQueryFetcher.getSwitchIntValue(String switchName, int defValue)
//获取String开关值,拉取失败或未拉取到配置返回defValue默认值
SwitchQueryFetcher.getSwitchStringValue(String switchName, String defValue)
4.1.2 Apple 平台接入
//自定义bool开关,获取不到返回NO
BOOL JDSwitchBoolValue(NSString *key);
//自定义整型开关,获取不到返回0
NSInteger JDSwitchIntValue(NSString *key);
//自定义字符开关,获取不到返回nil
NSString* JDSwitchStringValue(NSString *key);
//取intvalue
NSNumber *n1 = [JDRouter openURL:@"router://JDBSHServerConfigModule/intValue?key=test"
arg:nil
error:nil
completion:nil];
//取boolvalue
NSNumber *n2 = [JDRouter openURL:@"router://JDBSHServerConfigModule/boolValue?key=test"
arg:nil
error:nil
completion:nil];
//取stringValue
NSString *n3 = [JDRouter openURL:@"router://JDBSHServerConfigModule/stringValue?key=test"
arg:nil
error:nil
completion:nil];
4.2 CMS创建
4.2.1 业务模块创建
进入CMS界面,选择左侧的模块管理菜单,进入模块管理界面,新增业务模块,弹出弹窗如下图:
1)名称:对应业务模块名称;
2)关键字:设置对应业务模块的关键字;
3)管理员:模块分配的管理员,一般默认为模块的创建者;
4)成员:该模块分配的管理成员,成员有新增,删除,修改该模块下的配置权限,但没有修改,删除当前模块的权限;
4.2.2 配置创建
创建好业务模块后,在该业务模块下新建或者编辑配置,编辑界面如下图:
1)开关编号:为当前开关配置分配的唯一标识编号;
2)平台版本:目前支持android,apple,ipad三种平台,可支持开关生效App的版本的区间范围设置,按照左闭右开的原则,默认不设置,全版本生效;
3)系统版本:设置系统版本的区间,默认不设置,全系统版本生效;
4)开关类型:目前支持布尔开关,整形开关,字符串开关以及敏感数据开关(10.4.4版本以上)4种类型开关配置信息;
5)开关名称:设置的开关配置名称;
6)开关打开比例:命中规则为:android 平台根据uuid,apple平台根据openudid,通过hash算法算出来的值和100取余加1,如果最终值小于或者等于设置的值即为命中,反之不命中;
7)白名单:该开关配置对应的白名单,可以通过手动的方式将pin以逗号分隔拷贝到编辑框,未来可接入尝鲜系统通过扫码的方式添加白名单;
8)开关配置值:布尔开关默认不展示,整形或者字符串类型的配置类型需设置开关值;
9)开关描述:通过描述知道开关配置的用途。
05 收益
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目
5.1 护航X项目
5.1.1 启动接口降级
图7.启动接口降级效果示意
5.1.2 流量降级
5.2 护航618
06 结语
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目
未来Switchquery配置平台会为更多的业务模块提供配置服务,同时支持更完备的功能体验例如操作日志查看能力,支持机型过滤能力,黑白名单通过接入尝鲜平台通过扫码的方式动态添加等功能,打造一套具有秒级配置变更能力,助力业务快速变更的配置平台。
技术漫话:唠唠社区发现
大数据实时链路备战——数据双流高保真压测
Ui2Code+ChatGPT助力低代码搭建
求分享
求点赞
求在看